﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Net.Sockets;

using ConsoleTest.TestList;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            NSpeex.SpeexEncoder se = new NSpeex.SpeexEncoder(NSpeex.BandMode.Narrow);
            
        }

        static void SpeexTest(string[] args)
        {

        }

        static void MD5Test(string[] args)
        {
            System.Security.Cryptography.MD5 a = System.Security.Cryptography.MD5.Create();
            
        }

        static void DESTest(string[] args)
        {
            while (true)
            {
                Console.WriteLine(" *** DES加密解密测试 ***\n加密内容:");
                string input = Console.ReadLine(),
                    iKey = Console.ReadLine(),
                    iIV = Console.ReadLine();


                UtilCodePack.Security.Cryptography.DESCryptography des =
                    new UtilCodePack.Security.Cryptography.DESCryptography(iKey, iIV);

                string enc = des.Encrypt(input);
                Console.WriteLine(enc);

                string dec = des.Decrypt(enc);
                Console.WriteLine(dec);

            }
        }

        static void AESTest(string[] args)
        {
            while (true)
            {
                Console.WriteLine(" *** AES加密解密测试 ***\n加密内容:");
                string input = Console.ReadLine(),
                    iKey = Console.ReadLine(),
                    iIV = Console.ReadLine();


                UtilCodePack.Security.Cryptography.AESCryptography aes =
                    new UtilCodePack.Security.Cryptography.AESCryptography(iKey, iIV);

                string enc = aes.Encrypt(input);
                Console.WriteLine(enc);

                string dec = aes.Decrypt(enc);
                Console.WriteLine(dec);

            }
        }

        static void NetConnectionTest(string[] args)
        {
            

            // *** //
            if (args.Length < 1) return;
            if (args[0] == "-s")
            {
                TcpListener server = null;
                try
                {
                    // Set the TcpListener on port 13000.
                    Int32 port = 13000;
                    IPAddress localAddr = IPAddress.Parse("0.0.0.0");

                    // TcpListener server = new TcpListener(port);
                    server = new TcpListener(localAddr, port);

                    // Start listening for client requests.
                    server.Start();

                    // Buffer for reading data
                    Byte[] bytes = new Byte[256];
                    String data = null;

                    // Enter the listening loop.
                    while (true)
                    {
                        Console.Write("Waiting for a connection... ");

                        // Perform a blocking call to accept requests.
                        // You could also user server.AcceptSocket() here.
                        TcpClient client = server.AcceptTcpClient();
                        Console.WriteLine("Connected!");

                        data = null;

                        // Get a stream object for reading and writing
                        NetworkStream stream = client.GetStream();

                        int i;

                        // Loop to receive all the data sent by the client.
                        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                        {
                            // Translate data bytes to a ASCII string.
                            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                            Console.WriteLine("Received: {0}", data);

                            // Process the data sent by the client.
                            data = data.ToUpper();

                            byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                            // Send back a response.
                            stream.Write(msg, 0, msg.Length);
                            Console.WriteLine("Sent: {0}", data);
                        }

                        // Shutdown and end connection
                        client.Close();
                    }
                }
                catch (SocketException e)
                {
                    Console.WriteLine("SocketException: {0}", e);
                }
                finally
                {
                    // Stop listening for new clients.
                    server.Stop();
                }


                Console.WriteLine("\nHit enter to continue...");
                Console.Read();

            }
            else if(args[0] == "-c")
            {
                try
                {
                    string server, message;
                    Console.Write("SERVER>"); server = Console.ReadLine();
                    Console.Write("MESSAGE>"); message = Console.ReadLine();
                    // Create a TcpClient.
                    // Note, for this client to work you need to have a TcpServer 
                    // connected to the same address as specified by the server, port
                    // combination.
                    Int32 port = 13000;
                    TcpClient client = new TcpClient(server, port);

                    // Translate the passed message into ASCII and store it as a Byte array.
                    Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

                    // Get a client stream for reading and writing.
                    //  Stream stream = client.GetStream();

                    NetworkStream stream = client.GetStream();

                    // Send the message to the connected TcpServer. 
                    stream.Write(data, 0, data.Length);

                    Console.WriteLine("Sent: {0}", message);

                    // Receive the TcpServer.response.

                    // Buffer to store the response bytes.
                    data = new Byte[256];

                    // String to store the response ASCII representation.
                    String responseData = String.Empty;

                    // Read the first batch of the TcpServer response bytes.
                    Int32 bytes = stream.Read(data, 0, data.Length);
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                    Console.WriteLine("Received: {0}", responseData);

                    // Close everything.
                    stream.Close();
                    client.Close();
                }
                catch (ArgumentNullException e)
                {
                    Console.WriteLine("ArgumentNullException: {0}", e);
                }
                catch (SocketException e)
                {
                    Console.WriteLine("SocketException: {0}", e);
                }

                Console.WriteLine("\n Press Enter to continue...");
                Console.Read();
            }
        }
    }
}
